package operador.equacoes;

import java.util.Random;

import base.EquacaoVelocidade;
import base.Particula;

public class EquacaoClerc implements EquacaoVelocidade {
	private static double C1_C2 = 2.05;
	
	private double fatorConstricao;
	
	public EquacaoClerc(){
		double phi = C1_C2*2;
		fatorConstricao = 2/Math.abs(2-phi-Math.sqrt(phi*phi-4*phi));
	}
	
	@Override
	public void calcularNovaPosicao(Particula particula, int interacao) {	
		Random rand = new Random();
		
		double[] localBest = particula.getMelhorPosicaoParticula();
		double[] globalBest = particula.getMelhorPosicaoGlobalVizualizada();
		double[] posicaoAtual = particula.getPosicao();
		double[] posicaoNova = new double[posicaoAtual.length];
		double[] velocidadeAtual = particula.getVelocidade();
		double[] velocidadeNova = new double[velocidadeAtual.length];
		
		for(int i=0; i<posicaoAtual.length; i++){
			double novaVelocidade = velocidadeAtual[i];
			novaVelocidade += C1_C2 * rand.nextDouble()* (localBest[i] - posicaoAtual[i]);
			novaVelocidade += C1_C2 * rand.nextDouble()* (globalBest[i] - posicaoAtual[i]);
			novaVelocidade *= fatorConstricao;
			
			velocidadeNova[i] = novaVelocidade;
			posicaoNova[i] = posicaoAtual[i] + novaVelocidade;
		}
		
		particula.setVelocidade(velocidadeNova);
		particula.setPosicao(posicaoNova);
	}
}
